import {
  ObjectOnlyPushSet,
  removeObjectOnlyPushSet,
} from '../../../Func/uniFunc/Func/ObjectOnlyPushSet_operate';
import { toStringTypeCheck } from '../../../Func/uniFunc/Func/toStringTypeCheck';

const attribute_manaTag = 'attribute_mana';

/**
 * js 数据 和 dom  属性 及时更新 管理
 */
class attribute_mana {
  get [Symbol.toStringTag]() {
    return attribute_manaTag;
  }

  /**
   * 绑定 target element
   * @param {HTMLElement} element
   */
  constructor(element) {
    this.target = element;
  }

  /**
   * 已设置 的 信息
   */
  data = [];

  /**
   * 指定 dom 元素
   * @type {HTMLElement}
   */
  target;

  /**
   * 设置 一个信息 值
   * @param {string} key
   * @param {string} val
   */
  setAttribute(key, val) {
    setKeyVal(this, key, val);
    activeToElement(this, key, val);
  }

  /**
   * 移除 一个 信息值
   * @param {string} key
   */
  removeAttribute(key) {
    removeKeyVal(this, key);
    removetoElement(this, key);
  }

  /**
   * 移除 给定 数据集 的 信息值
   * @param {string | string[]} [keyArr = this.data]
   */
  removeAllAttribute(keyArr = this.data) {
    if (toStringTypeCheck(keyArr, 'string')) {
      keyArr = [keyArr];
    }

    for (const key of keyArr) {
      if (this.data.includes(key)) {
        this.removeAttribute(key);
      }
    }
  }

  /**
   * 获取 一个 信息值
   * @param {string} key
   * @returns {string}
   */
  getAttribute(key) {
    if (this.data.includes(key)) {
      return this[key];
    }
  }

  /**
   * 获取 所有 已记录 的 信息
   * @return {string}
   */
  getAllAttribute() {
    return this.getFormateAttribute(this.data);
  }

  /**
   * 批量 获取 对应 数据
   * @param {string | array} arr
   * @returns
   */
  getFormateAttribute(arr) {
    if (toStringTypeCheck(arr, 'string')) {
      arr = [arr];
    }
    let retobj = { data: [] };
    if (toStringTypeCheck(arr, 'array')) {
      for (const key of arr) {
        ObjectOnlyPushSet(retobj, key, this.getAttribute(key));
      }
      return retobj;
    }
    return { data: [] };
  }

  /**
   * 批量 添加 数据 ( data key 值 除外!! )
   * @param {{data:[]}} arr
   */
  setFormateAttribute(obj) {
    if (toStringTypeCheck(obj, 'object')) {
      for (const key in obj) {
        if (key == 'data') {
          continue;
        }
        this.setAttribute(key, obj[key]);
      }
    }
  }
}

/**
 * 记录信息 -- ObjectOnlyPushSet
 * @param {this} that
 * @param {string} key
 * @param {string} val
 */
function setKeyVal(that, key, val) {
  // 添加
  if (!ObjectOnlyPushSet(that, key, val)) {
    that[key] = val;
  }
}

/**
 * 删掉 -- ObjectOnlyPushSet
 * @param {this} that
 * @param {string} key
 * @param {string} val
 */
function removeKeyVal(that, key) {
  removeObjectOnlyPushSet(that, key);
}

/**
 * 将数据 更新到 dom 上
 * @param {this} that
 * @param {string} key
 * @param {string} val
 */
function activeToElement(that, key, val) {
  that.target.setAttribute(key, val);
}

/**
 * 删除数据 更新到 dom 上
 * @param {this} that
 * @param {string} key
 * @param {string} val
 */
function removetoElement(that, key) {
  that.target.removeAttribute(key);
}

export { attribute_mana };
